import json5 from 'json5';

/**
 * 根据当前环境创建服务配置 处理基础URL和其他服务的URL配置
 *
 * @param env 当前环境变量
 * @returns 完整的服务配置对象
 */
export function createServiceConfig(env: Env.ImportMeta) {
  const { VITE_SERVICE_BASE_URL, VITE_OTHER_SERVICE_BASE_URL } = env;

  // 解析其他服务的URL配置
  let other = {} as Record<App.Service.OtherBaseURLKey, string>;
  try {
    other = json5.parse(VITE_OTHER_SERVICE_BASE_URL);
  } catch {
    // eslint-disable-next-line no-console
    console.error('VITE_OTHER_SERVICE_BASE_URL 不是有效的 json5 字符串');
  }

  // 创建基础HTTP配置
  const httpConfig: App.Service.SimpleServiceConfig = {
    baseURL: VITE_SERVICE_BASE_URL,
    other
  };

  // 获取其他服务的配置键
  const otherHttpKeys = Object.keys(httpConfig.other) as App.Service.OtherBaseURLKey[];

  // 为每个其他服务创建完整配置
  const otherConfig: App.Service.OtherServiceConfigItem[] = otherHttpKeys.map(key => {
    return {
      key,
      baseURL: httpConfig.other[key],
      proxyPattern: createProxyPattern(key)
    };
  });

  // 返回完整的服务配置
  const config: App.Service.ServiceConfig = {
    baseURL: httpConfig.baseURL,
    proxyPattern: createProxyPattern(),
    other: otherConfig
  };

  return config;
}

/**
 * 获取后端服务的基础URL 根据是否使用代理返回不同的URL配置
 *
 * @param env - 当前环境变量
 * @param isProxy - 是否使用代理
 * @returns 包含基础URL和其他服务URL的配置对象
 */
export function getServiceBaseURL(env: Env.ImportMeta, isProxy: boolean) {
  const { baseURL, other } = createServiceConfig(env);

  // 处理其他服务的URL配置
  const otherBaseURL = {} as Record<App.Service.OtherBaseURLKey, string>;

  other.forEach(item => {
    otherBaseURL[item.key] = isProxy ? item.proxyPattern : item.baseURL;
  });

  return {
    baseURL: isProxy ? createProxyPattern() : baseURL,
    otherBaseURL
  };
}

/**
 * 创建代理URL模式 根据服务键生成对应的代理路径
 *
 * @param key 服务键，如果未设置则使用默认键
 * @returns 代理URL模式
 */
function createProxyPattern(key?: App.Service.OtherBaseURLKey) {
  return 'http://localhost:3000';
  if (!key) {
    return '/proxy-default';
  }

  return `/proxy-${key}`;
}
